/**
 * ===================================
 * 主游戏场景 (MainScene.js)
 * ===================================
 * 
 * 功能说明：
 * - 游戏的核心场景，包含主要的游戏逻辑
 * - 管理玩家、敌人、碰撞检测、分数系统
 * - 处理输入控制（键盘、鼠标）
 * - 协调多个场景的切换和通信
 * - 实现游戏计时和结束逻辑
 * 
 * 场景流程：
 * 1. 初始化背景和游戏对象
 * 2. 等待菜单场景的开始信号
 * 3. 启动游戏逻辑和计时器
 * 4. 处理游戏循环和碰撞检测
 * 5. 游戏结束时跳转到结束场景
 * 
 * 作者：游戏开发团队
 * 创建时间：2024年
 */

// 导入Phaser3场景基类
import { Scene } from "phaser";
// 导入游戏对象类
import { Player } from "../gameobjects/Player";
import { BlueEnemy } from "../gameobjects/BlueEnemy";

/**
 * 主游戏场景类 - 继承自Phaser.Scene
 * 负责管理游戏的核心逻辑和对象交互
 */
export class MainScene extends Scene {
    
    // ===== 游戏对象 =====
    player = null;                      // 玩家对象实例
    enemy_blue = null;                  // 蓝色敌人对象实例
    
    // ===== 输入控制 =====
    cursors = null;                     // 方向键对象（上下左右和空格键）
    
    // ===== 游戏状态 =====
    points = 0;                         // 当前游戏分数
    game_over_timeout = 20;             // 游戏倒计时（秒）

    /**
     * 构造函数 - 初始化场景
     * 设置场景的唯一标识符为 "MainScene"
     */
    constructor() {
        super("MainScene");
    }

    /**
     * ===== init() 生命周期方法 =====
     * 场景启动时调用，用于初始化场景状态
     * 在create()之前执行
     */
    init() {
        // ===== 相机淡入效果 =====
        // 从黑色淡入到正常显示，持续1秒
        this.cameras.main.fadeIn(1000, 0, 0, 0);
        
        // ===== 启动菜单场景 =====
        // 并行启动菜单场景，显示开始按钮
        this.scene.launch("MenuScene");

        // ===== 重置游戏状态 =====
        // 确保每次重新开始游戏时状态正确
        this.points = 0;                    // 重置分数
        this.game_over_timeout = 20;        // 重置倒计时
    }

    /**
     * ===== create() 生命周期方法 =====
     * 在场景资源加载完成后调用，用于创建游戏对象和设置逻辑
     */
    create() {
        // ===== 创建背景元素 =====
        // 添加背景图片，设置原点为左上角
        this.add.image(0, 0, "background")
            .setOrigin(0, 0);
        
        // 添加地面图片，设置原点为左下角，定位在屏幕底部
        this.add.image(0, this.scale.height, "floor")
            .setOrigin(0, 1);

        // ===== 创建游戏对象 =====
        // 创建玩家对象，传入当前场景引用
        this.player = new Player({ scene: this });

        // 创建蓝色敌人对象
        this.enemy_blue = new BlueEnemy(this);

        // ===== 设置输入控制 =====
        // 创建方向键控制对象（包含上下左右箭头键和空格键）
        this.cursors = this.input.keyboard.createCursorKeys();
        
        // 监听空格键按下事件，触发玩家射击
        this.cursors.space.on("down", () => {
            this.player.fire();  // 直线射击
        });
        
        // 监听鼠标点击事件，触发指向性射击
        this.input.on("pointerdown", (pointer) => {
            // 向鼠标点击位置射击
            this.player.fire(pointer.x, pointer.y);
        });

        // ===== 设置碰撞检测 =====
        
        // 玩家子弹与敌人的碰撞检测
        this.physics.add.overlap(
            this.player.bullets,        // 检测对象1：玩家子弹组
            this.enemy_blue,            // 检测对象2：蓝色敌人
            (enemy, bullet) => {        // 碰撞回调函数
                // 销毁子弹并播放爆炸效果
                bullet.destroyBullet();
                
                // 敌人受伤，传入玩家位置用于反击
                this.enemy_blue.damage(this.player.x, this.player.y);
                
                // 增加分数
                this.points += 10;
                
                // 更新HUD场景中的分数显示
                this.scene.get("HudScene")
                    .update_points(this.points);
            }
        );

        // 敌人子弹与玩家的碰撞检测
        this.physics.add.overlap(
            this.enemy_blue.bullets,    // 检测对象1：敌人子弹组
            this.player,                // 检测对象2：玩家
            (player, bullet) => {       // 碰撞回调函数
                // 销毁敌人子弹
                bullet.destroyBullet();
                
                // ===== 玩家受伤视觉效果 =====
                // 相机震动效果：持续100ms，强度0.01
                this.cameras.main.shake(100, 0.01);
                
                // 屏幕闪白效果：持续300ms，白色闪光
                this.cameras.main.flash(300, 255, 10, 10, false);
                
                // 扣除分数
                this.points -= 10;
                
                // 更新HUD场景中的分数显示
                this.scene.get("HudScene")
                    .update_points(this.points);
            }
        );

        // ===== 监听游戏开始事件 =====
        // 这个事件由MenuScene发送，表示玩家点击了开始按钮
        this.game.events.on("start-game", () => {
            // ===== 场景切换 =====
            // 停止菜单场景
            this.scene.stop("MenuScene");
            
            // 启动HUD场景，传入倒计时参数
            this.scene.launch("HudScene", { 
                remaining_time: this.game_over_timeout 
            });

            // ===== 启动游戏对象 =====
            // 启动玩家入场动画
            this.player.start();
            
            // 启动敌人入场动画
            this.enemy_blue.start();

            // ===== 设置游戏倒计时 =====
            this.time.addEvent({
                delay: 1000,                // 每秒触发一次
                loop: true,                 // 循环执行
                callback: () => {
                    if (this.game_over_timeout === 0) {
                        // ===== 游戏结束处理 =====
                        
                        // 移除事件监听器，避免重复触发
                        this.game.events.removeListener("start-game");
                        
                        // 停止并行运行的HUD场景
                        this.scene.stop("HudScene");
                        
                        // 跳转到游戏结束场景，传入最终分数
                        this.scene.start("GameOverScene", { 
                            points: this.points 
                        });
                    } else {
                        // ===== 倒计时递减 =====
                        this.game_over_timeout--;
                        
                        // 更新HUD场景中的倒计时显示
                        this.scene.get("HudScene")
                            .update_timeout(this.game_over_timeout);
                    }
                }
            });
        });
    }

    /**
     * ===== update() 生命周期方法 =====
     * 每帧调用，处理游戏逻辑更新
     * 通常以60FPS的频率执行
     */
    update() {
        // ===== 更新游戏对象 =====
        // 更新玩家状态（悬浮动画、推进器位置等）
        this.player.update();
        
        // 更新敌人状态（如果有自定义update逻辑）
        this.enemy_blue.update();

        // ===== 处理玩家移动输入 =====
        // 检查上方向键是否按下
        if (this.cursors.up.isDown) {
            this.player.move("up");     // 玩家向上移动
        }
        
        // 检查下方向键是否按下
        if (this.cursors.down.isDown) {
            this.player.move("down");   // 玩家向下移动
        }

        // 注意：左右移动在这个游戏中没有实现
        // 玩家只能在垂直方向上移动
    }
}